package com.msmall.community.roster.service;

import java.util.List;

import com.msmall.base.service.BaseManager;
import com.msmall.community.roster.model.Roster;
import com.msmall.community.roster.model.RosterGroup;
import com.msmall.community.roster.model.RosterItem;

public interface RosterManager extends BaseManager<Roster, Long>{

	/**
	 * 获得用户默认陌生人组
	 * 如果没有，则创建
	 */
	public RosterGroup getGroupStranger(Long userid);
	/**
	 * 获得用户默认好友组
	 * 如果没有，则创建
	 */
	public RosterGroup getGroupFriend(Long userid);
	/**
	 * 获得用户默认黑名单组
	 * 如果没有，则创建
	 */
	public RosterGroup getGroupBlacklist(Long userid);
	/**
	 * 获得用户默认被黑名单组
	 * 如果没有，则创建
	 */
	public RosterGroup getGroupForbidden(Long userid);
	/**
	 * 发送好友请求 ownerid 请求加friendid好友
	 * @param ownerid 
	 * @param friendid 
	 * @param content请求内容
	 */
	public void ask(Long ownerid, Long friendid, String content) throws Exception;
	/**
	 * 接受请求，同时修改消息状态 如果是默认的陌生人组/黑名单组，则移动到默认的好友组(双方)
	 * friendid接受ownerid的请求
	 */
	public void accept(Long friendid, Long ownerid, Long messageid) throws Exception;
	/**
	 * 拒绝请求，同时修改消息状态; 同时移动到默认的陌生人组(双方)
	 * friendid拒绝ownerid的请求
	 */
	public void reject(Long friendid, Long ownerid, Long messageid) throws Exception;
	
	/**
	 * 获得UID1对UID2的好友关系
	 */
	public Roster getRoster(Long uid1, Long uid2);
	/**
	 * 获得puber和suber的好友关系互相
	 */
	public RosterItem getRosterItem(Long puber, Long suber);
	
	/**
	 * 获得用户的所有组
	 */
	public List<RosterGroup> getRosterGroup(Long userid);
	/**
	 * 获得用户的组
	 */
	public RosterGroup getRosterGroup(Long userid, String groupName);
	
	/**
	 * 获得用户除去Forbidden的组
	 */
	public List<RosterGroup> getRosterGroupSelf(Long userid);
	/**
	 * 获得用户除去黑名单/陌生人的组
	 */
	public List<RosterGroup> getRosterGroupNormal(Long userid);
	
	/**
	 * 任何删除，双方的关系都删除
	 */
	public void removeRoster(Long userid, Long friendid);
	/**
	 * 用户userid将friendid移动到新组targetGroupid</br>
	 * 需要处理的移动情况包括：</br>
	 * X:表示不处理，V表示处理
	 * <table><tr><td>TO\FROM</td><td>Forbidden</td><td>黑名单<br/>(只删除)</td><td>陌生人</td><td>好友</td></tr>
	 * <tr><td>Forbidden</td><td>X</td><td>X</td><td>X</td><td>X</td></tr>
	 * <tr><td>黑名单</td><td>X</td><td>X</td><td>V</td><td>V</td></tr>
	 * <tr><td>陌生人</td><td>X</td><td>X</td><td>X</td><td>V双方陌生人<br/>相当于被移动的人发请求</td></tr><tr>
	 * <td>好友</td><td>X</td><td>X</td><td>V发送方不可移动<br/>接受方可以移动</td><td>V</td></tr>
	 * </table>
	 */
	public void moveGroup(Long userid, Long friendid, Long targetGroupid);
	
	/**
	 * 用户创建/更新组
	 * 组名不能重复
	 */
	public RosterGroup saveGroup(Long userid, RosterGroup rosterGroup);
	
	/**
	 * 用户删除组；
	 * 不能删除4个默认的组
	 * roster: true同时删除组下所有好友； false只删除组，组下好友被移动到默认好友组
	 */
	public void deleteGroup(Long userid, Long groupid, boolean roster);
	
}
